package _11generics

import "errors"

// T 类型参数， 名字叫做T， 约束是any, 等于没有约束
type List[T any] interface {
	Add(idx int, t T)
	Append(t T)
}

type MyMarshal struct {
}

func (m MyMarshal) MarshalJSON() ([]byte, error) {
	panic("implement me")
}

func UseList() {
	var lany List[any]
	lany.Append(12.3)
	lany.Append(123)

	lk := LinkedList[int]{}
	intVal := lk.head.val
	println(intVal)

}

type LinkedList[Daming any] struct {
	head *node[Daming]
	t    Daming
	tp   *Daming
	tp2  ***Daming
}

type node[T any] struct {
	val T
}

func Max[T Number](vals ...T) (T, error) {
	if len(vals) == 0 {
		var t T
		return t, errors.New("下标不对")
	}
	var t T
	for _, val := range vals {
		if val > t {
			t = val
		}
	}
	return t, nil
}

// 实现的功能：在一个切片中间增加一个元素
func AddSlice[T any](slice []T, idx int, val T) ([]T, error) {
	if idx < 0 || idx > len(slice) {
		return nil, errors.New("下标出错")
	}

	res := make([]T, 0, len(slice)+1)
	for i := 0; i < idx; i++ {
		res = append(res, slice[i])
	}
	res[idx] = val
	for i := idx; i < len(slice); i++ {
		res = append(res, slice[i])
	}

	return res, nil
}
